#!/bin/bash

# ============================================
# 磁盘清理脚本 - 安全清理
# ============================================

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

echo_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

echo_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

echo_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查是否为 root
if [ "$EUID" -ne 0 ]; then
    echo_error "请使用 sudo 运行此脚本"
    exit 1
fi

echo_info "============================================"
echo_info "磁盘清理脚本"
echo_info "============================================"
echo ""

# 显示清理前的磁盘使用
echo_step "清理前的磁盘使用情况："
df -h / | tail -1
BEFORE_AVAIL=$(df -h / | tail -1 | awk '{print $4}')
echo ""

# 1. 清理 DNF/YUM 缓存
echo_step "1. 清理包管理器缓存..."
if command -v dnf &> /dev/null; then
    BEFORE=$(du -sh /var/cache/dnf 2>/dev/null | cut -f1 || echo "0")
    echo_info "清理前 DNF 缓存: $BEFORE"
    dnf clean all
    AFTER=$(du -sh /var/cache/dnf 2>/dev/null | cut -f1 || echo "0")
    echo_info "✓ DNF 缓存已清理（清理后: $AFTER）"
elif command -v yum &> /dev/null; then
    BEFORE=$(du -sh /var/cache/yum 2>/dev/null | cut -f1 || echo "0")
    echo_info "清理前 YUM 缓存: $BEFORE"
    yum clean all
    AFTER=$(du -sh /var/cache/yum 2>/dev/null | cut -f1 || echo "0")
    echo_info "✓ YUM 缓存已清理（清理后: $AFTER）"
fi
echo ""

# 2. 清理系统日志
echo_step "2. 清理系统日志..."
BEFORE_LOG=$(journalctl --disk-usage 2>/dev/null | grep -oP '\d+\.\d+\w+' || echo "0B")
echo_info "清理前日志大小: $BEFORE_LOG"
journalctl --vacuum-time=3d 2>/dev/null || true
AFTER_LOG=$(journalctl --disk-usage 2>/dev/null | grep -oP '\d+\.\d+\w+' || echo "0B")
echo_info "✓ 系统日志已清理（保留最近3天，清理后: $AFTER_LOG）"
echo ""

# 3. 清理临时文件
echo_step "3. 清理临时文件..."
TMP_SIZE=$(du -sh /tmp 2>/dev/null | cut -f1 || echo "0")
echo_info "清理前 /tmp 大小: $TMP_SIZE"
rm -rf /tmp/pip-* /tmp/pip-build-env-* /tmp/*.log /tmp/*.tmp 2>/dev/null || true
TMP_SIZE_AFTER=$(du -sh /tmp 2>/dev/null | cut -f1 || echo "0")
echo_info "✓ 临时文件已清理（清理后: $TMP_SIZE_AFTER）"
echo ""

# 4. 清理 pip 缓存
echo_step "4. 清理 pip 缓存..."
if command -v pip &> /dev/null; then
    PIP_CACHE=$(pip cache dir 2>/dev/null || echo "")
    if [ -n "$PIP_CACHE" ] && [ -d "$PIP_CACHE" ]; then
        BEFORE_PIP=$(du -sh "$PIP_CACHE" 2>/dev/null | cut -f1 || echo "0")
        echo_info "清理前 pip 缓存: $BEFORE_PIP"
        pip cache purge 2>/dev/null || rm -rf "$PIP_CACHE"/* 2>/dev/null || true
        AFTER_PIP=$(du -sh "$PIP_CACHE" 2>/dev/null | cut -f1 || echo "0")
        echo_info "✓ pip 缓存已清理（清理后: $AFTER_PIP）"
    fi
    # 也清理用户目录下的缓存
    if [ -d ~/.cache/pip ]; then
        rm -rf ~/.cache/pip/* 2>/dev/null || true
        echo_info "✓ 用户 pip 缓存已清理"
    fi
fi
echo ""

# 5. 清理 Python 编译文件
echo_step "5. 清理 Python 编译文件..."
PYCACHE_COUNT=$(find /root -type d -name "__pycache__" 2>/dev/null | wc -l)
PYC_COUNT=$(find /root -name "*.pyc" 2>/dev/null | wc -l)
find /root -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find /root -name "*.pyc" -delete 2>/dev/null || true
find /root -name "*.pyo" -delete 2>/dev/null || true
echo_info "✓ 清理了 $PYCACHE_COUNT 个 __pycache__ 目录和 $PYC_COUNT 个 .pyc 文件"
echo ""

# 6. 清理旧日志文件
echo_step "6. 清理旧的应用日志文件..."
LOG_COUNT=$(find /var/log -name "*.log" -type f -mtime +7 2>/dev/null | wc -l)
GZ_COUNT=$(find /var/log -name "*.gz" -type f -mtime +7 2>/dev/null | wc -l)
find /var/log -name "*.log" -type f -mtime +7 -delete 2>/dev/null || true
find /var/log -name "*.gz" -type f -mtime +7 -delete 2>/dev/null || true
find /var/log -name "*.xz" -type f -mtime +7 -delete 2>/dev/null || true
echo_info "✓ 清理了 $LOG_COUNT 个旧日志文件和 $GZ_COUNT 个压缩日志文件（7天前）"
echo ""

# 7. 清理旧内核（可选）
echo_step "7. 清理旧内核..."
KERNEL_COUNT=$(rpm -qa | grep kernel | wc -l)
if [ "$KERNEL_COUNT" -gt 2 ]; then
    echo_warn "检测到 $KERNEL_COUNT 个内核，建议清理旧内核"
    read -p "是否清理旧内核？(y/N): " clean_kernel
    if [[ $clean_kernel =~ ^[Yy]$ ]]; then
        if command -v dnf &> /dev/null; then
            dnf remove --oldinstallonly --setopt installonly_limit=2 -y 2>/dev/null || true
            echo_info "✓ 旧内核已清理"
        elif command -v package-cleanup &> /dev/null; then
            package-cleanup --oldkernels --count=1 -y 2>/dev/null || true
            echo_info "✓ 旧内核已清理"
        fi
    fi
else
    echo_info "内核数量正常（$KERNEL_COUNT 个），跳过清理"
fi
echo ""

# 8. 清理 Docker（如果使用）
if command -v docker &> /dev/null; then
    echo_step "8. 清理 Docker..."
    read -p "是否清理 Docker 未使用的资源？(y/N): " clean_docker
    if [[ $clean_docker =~ ^[Yy]$ ]]; then
        docker system prune -a -f 2>/dev/null || true
        echo_info "✓ Docker 资源已清理"
    fi
fi
echo ""

# 显示清理后的磁盘使用
echo_step "清理后的磁盘使用情况："
df -h / | tail -1
AFTER_AVAIL=$(df -h / | tail -1 | awk '{print $4}')
echo ""

# 计算释放的空间（简单比较）
echo_info "============================================"
echo_info "清理完成！"
echo_info "============================================"
echo_info "清理前可用空间: $BEFORE_AVAIL"
echo_info "清理后可用空间: $AFTER_AVAIL"
echo_info ""
echo_info "如果空间仍然不足，可以执行："
echo_info "1. 查找大文件: find / -type f -size +100M 2>/dev/null | xargs du -h 2>/dev/null | sort -hr | head -20"
echo_info "2. 查看目录占用: du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20"
echo_info "3. 查看详细占用: du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -10"
echo_info "============================================"

